const axios = require('axios');

/**
 * AI报告生成服务
 * 支持多种AI API或使用本地规则引擎
 */

// 生成AI分析报告
async function generateAIReport(statistics) {
  const { class: className, total, average, max, min, passRate, excellentRate, distribution } = statistics;
  
  // 检查是否配置了AI API
  const hasAIConfig = process.env.OPENAI_API_KEY || process.env.QWEN_API_KEY;
  
  if (hasAIConfig && process.env.OPENAI_API_KEY) {
    // 使用OpenAI API
    return await generateOpenAIReport(statistics);
  } else if (hasAIConfig && process.env.QWEN_API_KEY) {
    // 使用通义千问API
    return await generateQwenReport(statistics);
  } else {
    // 使用本地规则引擎（无需API Key）
    return generateLocalReport(statistics);
  }
}

// 使用OpenAI API生成报告
async function generateOpenAIReport(statistics) {
  try {
    const prompt = buildPrompt(statistics);
    
    const response = await axios.post(
      `${process.env.OPENAI_API_URL}/chat/completions`,
      {
        model: 'gpt-3.5-turbo',
        messages: [
          {
            role: 'system',
            content: '你是一位经验丰富的教育数据分析师，擅长分析学生成绩数据并提供专业的教学建议。'
          },
          {
            role: 'user',
            content: prompt
          }
        ],
        temperature: 0.7,
        max_tokens: 1000
      },
      {
        headers: {
          'Authorization': `Bearer ${process.env.OPENAI_API_KEY}`,
          'Content-Type': 'application/json'
        },
        timeout: 30000
      }
    );
    
    return parseAIResponse(response.data.choices[0].message.content);
  } catch (error) {
    console.error('OpenAI API调用失败:', error.message);
    // 降级到本地规则引擎
    return generateLocalReport(statistics);
  }
}

// 使用通义千问API生成报告（示例，需根据实际API调整）
async function generateQwenReport(statistics) {
  try {
    const prompt = buildPrompt(statistics);
    
    // 注意：这里的API调用格式需要根据通义千问的实际API文档调整
    const response = await axios.post(
      process.env.QWEN_API_URL,
      {
        model: 'qwen-turbo',
        input: {
          messages: [
            {
              role: 'system',
              content: '你是一位经验丰富的教育数据分析师。'
            },
            {
              role: 'user',
              content: prompt
            }
          ]
        }
      },
      {
        headers: {
          'Authorization': `Bearer ${process.env.QWEN_API_KEY}`,
          'Content-Type': 'application/json'
        },
        timeout: 30000
      }
    );
    
    return parseAIResponse(response.data.output.text);
  } catch (error) {
    console.error('通义千问API调用失败:', error.message);
    return generateLocalReport(statistics);
  }
}

// 构建AI提示词
function buildPrompt(statistics) {
  const { class: className, course, total, average, max, min, passRate, excellentRate, distribution } = statistics;
  
  return `请分析以下${className}${course ? '的【' + course + '】课程' : ''}的成绩数据，并生成一份专业的成绩分析报告：

【统计信息】
- 班级：${className}
${course ? '- 课程：' + course + '\n' : ''}- 学生总数：${total}人
- 平均分：${average}分
- 最高分：${max}分
- 最低分：${min}分
- 及格率：${passRate}%
- 优秀率：${excellentRate}%
- 成绩分布：
  * 优秀（90-100分）：${distribution.excellent}人
  * 良好（80-89分）：${distribution.good}人
  * 中等（70-79分）：${distribution.medium}人
  * 及格（60-69分）：${distribution.pass}人
  * 不及格（<60分）：${distribution.fail}人

请按以下结构生成分析报告：

1. 【整体表现评价】（100字以内）
   总结${course ? '该课程' : ''}的整体成绩水平和特点

2. 【突出问题识别】
   列出2-3个需要关注的关键问题

3. 【教学改进建议】
   提供3-5条具体的、可操作的教学改进建议

4. 【学生分层辅导方案】
   针对不同分数段的学生提供针对性的辅导建议

要求：专业、简洁、具有可操作性。`;
}

// 使用本地规则引擎生成报告
function generateLocalReport(statistics) {
  const { class: className, course, total, average, max, min, passRate, excellentRate, distribution } = statistics;
  
  const courseInfo = course ? `${course}课程` : '平均成绩';
  
  // 整体表现评价
  let overall = '';
  if (average >= 85) {
    overall = `${className}的${courseInfo}整体表现优秀，平均分达到${average}分，显示出较高的学习水平。`;
  } else if (average >= 75) {
    overall = `${className}的${courseInfo}整体表现良好，平均分为${average}分，整体学习状况较为稳定。`;
  } else if (average >= 60) {
    overall = `${className}的${courseInfo}整体表现中等，平均分为${average}分，仍有较大提升空间。`;
  } else {
    overall = `${className}的${courseInfo}整体表现需要改进，平均分为${average}分，需要加强教学指导。`;
  }
  
  // 识别问题
  const problems = [];
  if (passRate < 80) {
    problems.push(`${courseInfo}及格率偏低（${passRate}%），有${distribution.fail}名学生不及格，需要重点关注`);
  }
  if (excellentRate < 15) {
    problems.push(`${courseInfo}优秀率较低（${excellentRate}%），尖子生培养需要加强`);
  }
  if (max - min > 50) {
    problems.push(`${courseInfo}成绩两极分化明显（最高${max}分，最低${min}分），班级内差异较大`);
  }
  if (distribution.medium + distribution.pass > total * 0.6) {
    problems.push(`${courseInfo}中等及及格学生占比过高，需要帮助他们向更高层次突破`);
  }
  
  // 教学建议
  const suggestions = [
    course ? `针对${course}课程建立分层教学机制，制定个性化学习计划` : '建立分层教学机制，针对不同水平的学生制定个性化学习计划',
    `加强${courseInfo}基础知识巩固，重点关注不及格学生的补差工作`,
    `开展优秀学生培优计划，设置挑战性任务激发学习潜力`,
    `定期进行阶段性测试和反馈，及时调整教学策略`,
    `鼓励学生互助学习，建立学习小组促进共同进步`
  ];
  
  // 分层辅导方案
  const guidanceByLevel = {
    excellent: distribution.excellent > 0 
      ? `优秀学生（${distribution.excellent}人）：提供${course ? course + '课程的' : ''}拓展性学习资源，培养创新思维和综合应用能力，可以让他们担任小组长帮助其他同学。`
      : '暂无优秀学生，需要加强尖子生培养。',
    good: distribution.good > 0
      ? `良好学生（${distribution.good}人）：鼓励向优秀冲刺，针对${course || '各科目'}薄弱环节进行专项训练，培养自主学习能力。`
      : '',
    medium: distribution.medium > 0
      ? `中等学生（${distribution.medium}人）：夯实${course || '各科目'}基础知识，培养良好的学习习惯，提供更多练习机会增强信心。`
      : '',
    pass: distribution.pass > 0
      ? `及格学生（${distribution.pass}人）：重点关注${course || '各科目'}基础知识掌握情况，一对一辅导，帮助他们建立学习兴趣。`
      : '',
    fail: distribution.fail > 0
      ? `不及格学生（${distribution.fail}人）：【重点关注】进行${course ? course + '课程的' : ''}课后专项辅导，从最基础的知识点开始，制定详细的提升计划，必要时与家长沟通共同帮助学生进步。`
      : ''
  };
  
  // 组装报告
  const report = {
    summary: overall,
    problems: problems.length > 0 ? problems : ['整体表现良好，继续保持'],
    suggestions: suggestions.slice(0, 5),
    guidance: {
      excellent: guidanceByLevel.excellent,
      good: guidanceByLevel.good,
      medium: guidanceByLevel.medium,
      pass: guidanceByLevel.pass,
      fail: guidanceByLevel.fail
    },
    conclusion: `总体而言，${className}${course ? '在' + course + '课程上' : ''}${total}名学生中，需要重点关注的是${distribution.fail}名不及格学生和${distribution.pass}名刚及格的学生。建议通过分层教学和个性化辅导，帮助每位学生都能取得进步。`
  };
  
  return report;
}

// 解析AI返回的文本为结构化数据
function parseAIResponse(text) {
  // 这里可以根据AI返回的格式进行解析
  // 简单起见，直接返回结构化对象
  return {
    summary: text.substring(0, 200),
    problems: ['AI分析问题1', 'AI分析问题2'],
    suggestions: ['AI建议1', 'AI建议2', 'AI建议3'],
    guidance: {
      excellent: 'AI针对优秀学生的建议',
      good: 'AI针对良好学生的建议',
      medium: 'AI针对中等学生的建议',
      pass: 'AI针对及格学生的建议',
      fail: 'AI针对不及格学生的建议'
    },
    conclusion: 'AI总结',
    rawText: text
  };
}

module.exports = {
  generateAIReport
};
